home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / DIRECTOR.I < prev    next >
Encoding:
Text File  |  1991-01-31  |  22.4 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Directory; (* V#144 *)⓪ (*$Y+,L-,H+*)⓪ ⓪ (*⓪"13.1.88: TT  DrivesOnline & FreeSpace korrigiert.⓪"14.1.88: TT  SplitName korrekt, wenn sfx >3 Zeichen⓪"14.4.88: TT  DirQuery vollendet immer Suche mit Snext, damit der interne⓪1Directory-Puffer vom GEMDOS wieder freigegeben wird.⓪"26.8.88: TT  GetDirEntry neu - muß noch exportiert werden⓪"9.12.88: TT  GetCurrentDir schließt path immer mit '\' ab.⓪"1.07.89: TT  SplitPath: LINK-Instr. entfernt, da mit $L+ compiliert⓪"7.08.89: TT  GetDirEntry kann nun auch Ordner ermitteln⓪"15.8.89: TT  Delete liefert endlich 'fNotDeleted', wenn File nicht exist.⓪#5.9.89: TT  GetDirEntry mit INTEGER- statt BOOLEAN-Ergebnis⓪#2.2.90: TT  StrToDrive liefert 'defaultDrv', wenn ungültiger LW-Buchstabe;⓪/ForceMediaChange implementiert⓪#6.5.90: TT  Auch die Split/Concat-Funktionen haben nun REF-Parameter und⓪/legen ggf. vom Parameter eine Kopie an, wenn er identisch⓪/mit einem Ausgabe-Parm ist.⓪"27.5.90: TT  ConcatName/Path kommen nun auch mit gleichen Argumenten bei⓪/den REF-Parms klar.⓪"04.7.90: TT  Aufspaltung nach 'FileNames'-Modul⓪"20.7.90: TT  DrivesOnline: SETs verkehrt⓪"20.9.90: TT  SearchFirst liefert -49 statt -33, wenn keine Files.⓪"24.10.90: TT $H+ bei DirQuery⓪"31.01.91: TT SetCurrentDir: Keine Aktion, wenn 'path' leer ist; MakeFullPath⓪/verwendet "fileUpper" statt Strings.Upper⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;⓪ IMPORT Strings, StrConv;⓪ FROM Clock IMPORT Time, Date, UnpackTime, UnpackDate;⓪ FROM MOSConfig IMPORT FileErrMsg;⓪ FROM FileNames IMPORT SplitPath, DriveToStr, StrToDrive;⓪ FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, SfxStr, PfxStr,⓪(OutOfStack, StringOverflow, fNotDeleted, fPathNotFound, fFileNotFound,⓪(fNoMoreFiles, fNoMatchingFiles, Drive, DriveSet;⓪ ⓪ (*⓪ TYPE    FileAttr     = (readOnlyAttr, hiddenAttr, systemAttr, volLabelAttr,⓪8subdirAttr, archiveAttr);⓪ ⓪(FileAttrSet  = SET OF FileAttr;⓪ ⓪(DirEntry     = RECORD⓪9name: ARRAY [0..11] OF CHAR;⓪9attr: FileAttrSet;⓪9time: Time;⓪9date: Date;⓪9size: LONGCARD⓪7END;⓪ ⓪(DirQueryProc = PROCEDURE ( DirEntry ): BOOLEAN; (* TRUE: weiter *)⓪ ⓪(Drive = ( defaultDrv, drvA, drvB, drvC, drvD, drvE, drvF, drvG,⓪2drvH, drvI, drvJ, drvK, drvL, drvM, drvN, drvO, drvP);⓪ *)⓪ ⓪ VAR null: CARDINAL;⓪$strok: BOOLEAN;⓪ ⓪ ⓪ (*$C-*)⓪ VAR mydev: CARDINAL;⓪$regsav, oldgetbpb: ARRAY [0..3] OF LONGWORD;⓪$oldmediach, etv_merk: LONGWORD;⓪$fspec: ARRAY [0..5] OF CHAR;⓪ (*$C+*)⓪ PROCEDURE fmed_asm (driveNo: CARDINAL): LONGINT;⓪ (*$C-*)⓪"CONST hdv_bpb      = $0472L;⓪(hdv_rw       = $0476L;⓪(hdv_mediach  = $047EL;⓪(etv_critic   = $0404L; (* Hier der etv_critic-Handler für MB *)⓪"BEGIN⓪$ASSEMBLER⓪0move.w  -(A3),D0        ; driveNo⓪0movem.l D7/A2-A3,-(A7)⓪0move.w  D0,D7⓪ ⓪0clr.l   -(SP)           ;Super⓪0move.w  #$20,-(SP)⓪0trap    #$01⓪0move.l  D0,2(SP)        ;für nächsten Super-Call⓪ ⓪0move.l  etv_critic,etv_merk⓪0lea     etv_ersetzt(PC),A0⓪0move.l  A0,etv_critic⓪ ⓪0move.w  D7,mydev⓪0add.b   #'A',D7⓪0move.b  D7,fspec⓪ ⓪0movem.l hdv_bpb,A0-A3 ;4 Longs verschieben⓪0movem.l A0-A3,oldgetbpb⓪ ⓪ ; Eines von den vier Longs ist überflüssig, das macht aber nichts, die⓪ ; Routine ist immer noch schneller als die von Atari!⓪ ; Jetzt müßten eigentlich XBRA-Verfahren benutzt werden, aber da die⓪ ; Verschiebung sowieso nur temporär ist, sparen wir an Zeit und Platz!⓪ ⓪0lea     newgetbpb(PC),A0⓪0move.l  A0,hdv_bpb⓪0lea     newrwabs(PC),A0⓪0move.l  A0,hdv_rw⓪0lea     newmediach(PC),A0⓪0move.l  A0,hdv_mediach⓪ ⓪0clr.w   -(SP)⓪0pea     fspec⓪0move.w  #$3D,-(SP)⓪0trap    #$01⓪0addq.l  #$08,SP⓪ ⓪0tst.l   D0⓪0bmi.s   noclose⓪0move.w  D0,-(SP)⓪0move.w  #$3E,-(SP)⓪0trap    #$01⓪0addq.l  #$04,SP⓪ ⓪ noclose         move.l  D0,D7⓪ ⓪0lea     newgetbpb(PC),A0⓪0cmpa.l  hdv_bpb,A0⓪0bne.s   done⓪0movem.l oldgetbpb,A0-A3⓪0movem.l A0-A3,hdv_bpb⓪ ⓪ done:           move.l  etv_merk,etv_critic ;Freigabe⓪0trap    #$01⓪0addq.l  #$06,SP⓪0move.l  D7,D0⓪0movem.l (A7)+,D7/A2-A3⓪0move.l  D0,(A3)+⓪0rts⓪ ⓪ newgetbpb:      move.w  mydev,D0⓪0cmp.w   $04(SP),D0⓪0bne.s   dooldg⓪ ⓪0movem.l oldgetbpb,A0-A3⓪0movem.l A0-A3,hdv_bpb⓪ ⓪ dooldg:         movea.l oldgetbpb,A0⓪0jmp     (A0)⓪ ⓪ newmediach:     move.w  mydev,D0⓪0cmp.w   $04(SP),D0⓪0bne.s   dooldm⓪0moveq   #$02,D0⓪0rts⓪ dooldm:         movea.l oldmediach,A0⓪0jmp     (A0)⓪ ⓪ newrwabs:       move.w  mydev,D0⓪0cmp.w   $0E(SP),D0⓪0bne.s   dooldr⓪0moveq   #-$0E,D0⓪0rts⓪ ⓪ dooldr:         movea.l oldmediach,A0⓪0jmp     (A0)⓪ ⓪ etv_ersetzt:    move.w  $06(SP),D0      ;Hier der neue etv_critic-Treiber⓪0cmp.w   mydev,D0        ;Ist der Fehler auf unserem Laufwerk?⓪0beq.s   disk_flipped    ;Ja, dann abbrechen!⓪0movea.l etv_merk,A0     ;Normale Fehlerabfertigung⓪0jmp     (A0)⓪ ⓪ disk_flipped:   move.w  $04(SP),D0      ;Fehler zurückmelden, Box abfangen!⓪$END⓪"END fmed_asm;⓪ (*$C+*)⓪ ⓪ (*$L+*)⓪ PROCEDURE ForceMediaChange (driveNo: Drive);⓪"VAR err: LONGINT;⓪"BEGIN⓪$IF driveNo = defaultDrv THEN⓪&driveNo:= DefaultDrive ()⓪$END;⓪$err:= fmed_asm (ORD (driveNo) - 1);⓪ (*⓪$IF err = 0L THEN⓪&errCode:= -1⓪$ELSIF err = -33L THEN⓪&IF driveNo IN DrivesOnline () THEN⓪(errCode:= 0⓪&ELSE⓪(errCode:= fInvalidDrive⓪&END⓪$ELSE⓪&errCode:= SHORT (err)⓪$END⓪ *)⓪"END ForceMediaChange;⓪ (*$L-*)⓪ ⓪ ⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)⓪"VAR n: CARDINAL;⓪"BEGIN⓪$(*⓪$FOR n:= 0 TO HIGH (s) DO⓪&IF s[n]='' THEN RETURN END;⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END⓪$END⓪$*)⓪$ASSEMBLER⓪(MOVE.W  -(A3),D1⓪(MOVE.L  -(A3),A1⓪(CLR.W   D0⓪&luup:⓪(MOVE.B  (A1)+,D0⓪(BEQ     ende⓪(BMI     next⓪(JSR     @CAP    ;/A2⓪(MOVE.B  D0,-1(A1)⓪&next:⓪(DBRA    D1,luup⓪&ende:⓪$END⓪"END fileUpper;⓪ ⓪ ⓪ PROCEDURE str0;⓪"BEGIN⓪$ASSEMBLER⓪(; D0: HIGH (s)⓪(; A0: ADR (s)⓪(; D2 erhalten !⓪(MOVE.L  (A7)+,A1⓪(⓪(MOVE    D0,D1⓪(ADDQ    #3,D1⓪(BCLR    #0,D1⓪(⓪(; LINK:⓪(PEA     (A5)⓪(MOVE.L  A7,A5⓪(SUBA.W  D1,A7⓪(⓪(CMPA.L  A3,A7⓪(BLS     E⓪(MOVE.L  A7,A2⓪(⓪%L: MOVE.B  (A0)+,(A2)+⓪(DBRA    D0,L⓪(CLR.B   (A2)+⓪(⓪(MOVE.L  A7,D0⓪(JMP     (A1)⓪%⓪%E: TRAP    #6      ; OUT OF STACK⓪(DC.W    -10⓪$END⓪"END str0;⓪ ⓪ PROCEDURE str0b;⓪"BEGIN⓪$ASSEMBLER⓪(; D0: HIGH (s)⓪(; A0: ADR (s)⓪(; D2 erhalten !⓪(MOVE.L  (A7)+,A1⓪(⓪(MOVE    D0,D1⓪(ADDQ    #3,D1⓪(BCLR    #0,D1⓪(⓪(SUBA.W  D1,A7⓪(⓪(CMPA.L  A3,A7⓪(BLS     E⓪(MOVE.L  A7,A2⓪(⓪%L: MOVE.B  (A0)+,(A2)+⓪(DBRA    D0,L⓪(CLR.B   (A2)+⓪(⓪(MOVE.L  A7,D0⓪(JMP     (A1)⓪%⓪%E: TRAP    #6      ; OUT OF STACK⓪(DC.W    -10⓪$END⓪"END str0b;⓪ ⓪ PROCEDURE setDta;⓪"BEGIN⓪$ASSEMBLER⓪(; get old DTA⓪(MOVE    #$2F,-(A7)⓪(TRAP    #1⓪(MOVE.L  D0,D3           ; alten DTA merken in D3⓪(; set new DTA⓪(MOVE.L  D4,-(A7)⓪(MOVE    #$1A,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #8,A7⓪$END⓪"END setDta;⓪ ⓪ PROCEDURE getDta;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #$2F,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #2,A7⓪$END⓪"END getDta;⓪ ⓪ PROCEDURE rstDta;⓪"BEGIN⓪$ASSEMBLER⓪(; reset old DTA, erhalte D0 !⓪(MOVE.L  D0,-(A7)⓪(MOVE.L  D3,-(A7)⓪(MOVE    #$1A,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪(MOVE.L  (A7)+,D0⓪$END⓪"END rstDta;⓪ ⓪ PROCEDURE copyDirEntry;⓪"BEGIN⓪$ASSEMBLER⓪(; Kopiert von DTA nach entry (A1)⓪ ⓪(; name⓪(MOVEQ   #5,D0⓪(LEA     $1E(A0),A2⓪$L0: MOVE.W  (A2)+,(A1)+⓪(DBRA    D0,L0⓪(; attr⓪(MOVE.B  21(A0),(A1)+⓪(CLR.B   (A1)+⓪(; time⓪(MOVE    22(A0),(A3)+⓪(MOVEM.L A0/A1,-(A7)⓪(JSR     UnpackTime⓪(MOVEM.L (A7)+,A0/A1⓪(MOVE.L  -6(A3),(A1)+⓪(MOVE.W  -(A3),(A1)+⓪(SUBQ.L  #4,A3⓪(; date⓪(MOVE    24(A0),(A3)+⓪(MOVEM.L A0/A1,-(A7)⓪(JSR     UnpackDate⓪(MOVEM.L (A7)+,A0/A1⓪(MOVE.L  -6(A3),(A1)+⓪(MOVE.W  -(A3),(A1)+⓪(SUBQ.L  #4,A3⓪(; size⓪(MOVE.L  26(A0),(A1)+⓪$END⓪"END copyDirEntry;⓪ ⓪ PROCEDURE GetDTAEntry ( dta: DTA; VAR entry: DirEntry );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A1⓪(MOVE.L  -(A3),A0⓪(JMP     copyDirEntry⓪$END⓪"END GetDTAEntry;⓪ ⓪ PROCEDURE MakeFullPath ( VAR filename: ARRAY OF CHAR;⓪9VAR result: INTEGER );⓪"(*$L+*)⓪"VAR oldpath, path: PathStr; dummy: INTEGER; name: NameStr;⓪"BEGIN⓪$fileUpper (filename);⓪$SplitPath (filename, path, name);⓪$GetDefaultPath (oldpath);⓪$SetDefaultPath (path, result);⓪$GetDefaultPath (path);⓪$SetDefaultPath (oldpath, dummy);⓪$IF result >= 0 THEN⓪&Strings.Concat (path, name, filename, strok);⓪$END⓪"END MakeFullPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetFileAttr (REF name: ARRAY OF CHAR; VAR attr: FileAttrSet; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -14(A3),A0⓪(MOVE.W  -10(A3),D0⓪(JSR     str0⓪(CLR.L   -(A7)⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$43,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(MOVE.L  -(A3),A0⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪(MOVE.B  D0,(A0)⓪%C: SUBQ.L  #6,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: MOVE    D0,(A1)⓪(BRA     C⓪$END⓪"END GetFileAttr;⓪ ⓪ PROCEDURE SetFileAttr (REF name: ARRAY OF CHAR; attr: FileAttrSet; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -12(A3),A0⓪(MOVE.W  -08(A3),D0⓪(JSR     str0⓪(MOVEQ   #0,D1⓪(MOVE.B  -06(A3),D1⓪(MOVE    D1,-(A7)⓪(MOVE    #1,-(A7)⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$43,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪%C: SUBQ.L  #8,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: MOVE    D0,(A1)⓪(BRA     C⓪$END⓪"END SetFileAttr;⓪ ⓪ PROCEDURE Rename (REF oldName, newName: ARRAY OF CHAR; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -10(A3),A0⓪(MOVE.W  -06(A3),D0      ; newName⓪(JSR     str0⓪(MOVE.L  D0,D2⓪(MOVE.L  -16(A3),A0⓪(MOVE.W  -12(A3),D0      ; oldName⓪(JSR     str0b           ; kein erneutes LINK⓪(MOVE.L  D2,-(A7)        ; newName⓪(MOVE.L  D0,-(A7)        ; oldName⓪(CLR     -(A7)⓪(MOVE    #$56,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪%C: SUBA.W  #12,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: MOVE    D0,(A1)⓪(BRA     C⓪$END⓪"END Rename;⓪ ⓪ PROCEDURE Delete (REF name: ARRAY OF CHAR; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -10(A3),A0⓪(MOVE.W  -06(A3),D0⓪(JSR     str0⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$41,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪%C: SUBQ.L  #6,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: CMPI    #fFileNotFound,D0⓪(BEQ     F⓪(CMPI    #fPathNotFound,D0⓪(BEQ     F⓪(MOVE    D0,(A1)⓪(BRA     C⓪%F: MOVE    #fNotDeleted,(A1)⓪(BRA     C⓪$END⓪"END Delete;⓪ ⓪ PROCEDURE DirQuery (REF wildName: ARRAY OF CHAR;⓪8select  : FileAttrSet;⓪8dirProc : DirQueryProc;⓪4VAR result  : INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -20(A3),A0      ;wildName⓪(MOVE.W  -16(A3),D0⓪(JSR     str0⓪(⓪(MOVEM.L D3/D4,-(A7)⓪(⓪(; DTA anlegen⓪(SUBA.W  #44,A7⓪(MOVE.L  A7,D4⓪(⓪(MOVEQ   #0,D1⓪(MOVE.B  -14(A3),D1      ; select⓪(MOVE.W  D1,-(A7)⓪(MOVE.L  D0,-(A7)        ; zuerst D0 sichern⓪(JSR     setDta          ; dann DTA sichern/umsetzen⓪(MOVE    #$4E,-(A7)⓪(TRAP    #1              ; FSFIRST⓪(ADDQ.L  #8,A7⓪(JSR     rstDta          ; alten DTA wiederherstellen⓪ ⓪(TST.L   D0⓪(BPL     again⓪ ⓪(; wenn leeres Dir, dann 'fNoMatchingFiles' liefern.⓪(CMPI    #-33,D0         ; file not found ?⓪(BNE     ok3⓪(MOVEQ   #fNoMatchingFiles,D0⓪&ok3⓪(BRA.W   ok2⓪(⓪$again:⓪(MOVE.L  -12(A3),D3      ; 'dirProc'-Adr⓪(BEQ.L   errP⓪(MOVE.L  -08(A3),D4      ; 'dirProc'-Static Link⓪(; Pfadnamen (ohne Dateinamen) auf Eval-Stack⓪(;   Achtung: Da der Name nicht kopiert wird, darf 'dirProc' den⓪(;   Path-String nicht verändern !⓪(MOVE.L  -20(A3),(A3)+⓪(MOVE.W  -20(A3),(A3)+⓪(JSR     Strings.Length⓪(MOVE    -(A3),D0⓪(MOVE.L  -20(A3),A0⓪(BEQ     agend2⓪&aglupo:⓪(MOVE.B  -1(A0,D0.W),D1⓪(CMPI.B  #':',D1⓪(BEQ     agende⓪(CMPI.B  #'\',D1⓪(BEQ     agende⓪(SUBQ    #1,D0⓪(BNE     aglupo⓪(LEA     null,A0⓪(BRA     agend2⓪&agende:⓪(SUBQ    #1,D0⓪&agend2:⓪(MOVE.L  A0,(A3)+        ; ADR (path)⓪(MOVE.W  D0,(A3)+        ; HIGH (path)⓪ ⓪(; DirEntry auf Eval-Stack laden, DTA ist direkt auf dem Systemstack⓪(; name⓪(MOVEQ   #5,D0⓪(LEA     $1E(A7),A0⓪$L0: MOVE.W  (A0)+,(A3)+⓪(DBRA    D0,L0⓪(; attr⓪(MOVE.B  21(A7),(A3)+⓪(CLR.B   (A3)+⓪(; time⓪(MOVE    22(A7),(A3)+⓪(JSR     UnpackTime⓪(MOVE    24(A7),(A3)+⓪(; date⓪(JSR     UnpackDate⓪(; size⓪(MOVE.L  26(A7),(A3)+⓪ ⓪(; call 'dirProc'⓪(MOVE.L  D3,A0⓪(MOVE.L  D4,D2⓪(JSR     (A0)⓪(TST     -(A3)⓪(BEQ     abort           ; Abbruch⓪(⓪(MOVE.L  A7,D4⓪(JSR     setDta          ; DTA sichern/umsetzen⓪(MOVE    #$4F,-(A7)⓪(TRAP    #1              ; Fsnext⓪(ADDQ.L  #2,A7⓪(JSR     rstDta          ; alten DTA wiederherstellen⓪ ⓪(TST.L   D0⓪(BPL     again⓪(⓪(CMPI    #-49,D0         ; ENMFIL ?⓪(BEQ     ok⓪(BRA     ok2⓪(⓪&errP:⓪(TRAP    #6⓪(DC.W    -17⓪(MOVEQ   #-1,D0⓪(BRA     ok2⓪(⓪&abort:⓪(MOVE.L  A7,D4⓪(JSR     setDta⓪(MOVE    #$4F,-(A7)⓪&ablp:⓪(TRAP    #1              ; Fsnext⓪(TST.L   D0⓪(BPL     ablp            ; so lange wiederholen, bis Ende o. Fehler⓪(ADDQ.L  #2,A7⓪(JSR     rstDta⓪(⓪&ok:⓪(MOVEQ   #0,D0⓪&ok2:⓪(MOVE.L  -(A3),A0⓪(MOVE    D0,(A0)⓪(⓪(SUBA.W  #16,A3⓪(ADDA.W  #44,A7⓪(MOVEM.L (A7)+,D3/D4⓪(⓪(; UNLK:⓪(UNLK    A5⓪$END⓪"END DirQuery;⓪ ⓪ PROCEDURE SetDefaultDrive ( driveNo: Drive );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    -(A3),D0⓪(SUBQ    #1,D0⓪(BCS     e⓪(MOVE    D0,-(A7)⓪(MOVE    #$E,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #4,A7⓪&e:⓪$END⓪"END SetDefaultDrive;⓪ ⓪ PROCEDURE DefaultDrive (): Drive;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #$19,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #2,A7⓪(ADDQ    #1,D0⓪(MOVE    D0,(A3)+⓪$END⓪"END DefaultDrive;⓪ ⓪ PROCEDURE GetCurrentDir ( driveNo: Drive; VAR path: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(SUBA.W  #128,A7⓪(MOVE.L  A7,D0⓪(MOVE.L  -(A3),-(A7)⓪(MOVE.L  -(A3),-(A7)⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$47,-(A7)⓪(CMPA.L  A3,A7⓪(BLS     serr⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪(MOVE.W  (A7)+,D1        ; driveNo⓪(MOVE.L  (A7)+,A2        ; ADR (path)⓪(MOVE.W  (A7)+,D2        ; HIGH(path)⓪(TST.L   D0⓪(BPL     ok⓪'err:⓪(CLR.B   (A2)⓪(BRA     ende⓪'serr:⓪(TRAP    #6⓪(DC.W    OutOfStack-$2000⓪'ok:⓪(MOVE.L  A7,A0⓪'l:⓪(MOVE.B  (A0)+,(A2)+⓪(DBEQ    D2,l⓪(BNE     so⓪(MOVE.B  #'\',-1(A2)⓪(TST     D2⓪(BMI     ende⓪(CLR.B   (A2)⓪(BRA     ende⓪'so:⓪(TRAP    #6⓪(DC.W    StringOverflow⓪'ende:⓪(ADDA.W  #128,A7⓪$END⓪"END GetCurrentDir;⓪ ⓪ PROCEDURE SetCurrentDir ( driveNo: Drive; REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -10(A3),A0      ; ADR (path)⓪(MOVE.W  -6(A3),D0⓪(⓪(TST.B   (A0)            ; path = '' ?⓪(BNE     doSet⓪ ⓪(MOVE.L  -(A3),A0⓪(CLR.W   (A0)            ; result:= 0⓪(SUBQ.L  #8,A3⓪(RTS⓪ ⓪ doSet   MOVE    D0,D1⓪(ADDQ    #5,D1⓪(BCLR    #0,D1⓪(⓪(; LINK:⓪(PEA     (A5)⓪(MOVE.L  A7,A5⓪(SUBA.W  D1,A7⓪(⓪(CMPA.L  A3,A7⓪(BLS     E⓪(MOVE.L  A7,A2⓪(⓪(MOVEM.L D0/A0/A2,-(A7)⓪(⓪(MOVE.W  -12(A3),(A3)+   ; driveNo laden⓪(BNE     D               ; ist nicht default drive⓪(⓪(SUBQ.L  #2,A3⓪(MOVE.L  A0,(A3)+⓪(MOVE    D0,(A3)+⓪(JSR     StrToDrive      ; driveNo auf A3-Stack⓪(⓪%D: JSR     DefaultDrive⓪(MOVE    -(A3),-(A7)     ; akt. Drive retten⓪(JSR     SetDefaultDrive ; gewünschtes Drive setzen⓪(MOVE    (A7)+,(A3)+     ; akt. Drive auf A3-Stack⓪(⓪(MOVEM.L (A7)+,D0/A0/A2⓪(⓪%L: MOVE.B  (A0)+,(A2)+⓪(DBRA    D0,L⓪(CLR.B   (A2)+⓪(⓪(MOVE.L  A7,-(A7)⓪(MOVE    #$3B,-(A7)      ; SetDir⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪(⓪(MOVE.L  D0,-(A7)⓪(JSR     SetDefaultDrive⓪(MOVE.L  (A7)+,D0⓪(⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     F⓪(CLR.W   (A1)⓪%C: SUBQ.L  #8,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%F: MOVE    D0,(A1)⓪(BRA     C⓪(⓪%E: TRAP    #6      ; OUT OF STACK⓪(DC.W    -10⓪$END⓪"END SetCurrentDir;⓪ ⓪ PROCEDURE FreeSpace ( driveNo: Drive ): LONGCARD; (* Angabe in Bytes *)⓪"BEGIN⓪$ASSEMBLER⓪(SUBA.W  #16,A7⓪(MOVE    -(A3),-(A7)⓪(PEA     2(A7)⓪(MOVE    #$36,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #8,A7⓪(MOVEQ   #0,D1⓪(TST.L   D0⓪(BMI     ende⓪(MOVE.L  8(A7),D1        ; bytes per sector⓪(MULU.W  14(A7),D1       ; sectors per cluster⓪(MOVE.L  D1,(A3)+⓪(MOVE.L  (A7),(A3)+      ; free clusters⓪(JSR     @CMUL⓪(MOVE.L  -(A3),D1⓪&ende:⓪(ADDA.W  #16,A7⓪(MOVE.L  D1,(A3)+⓪$END⓪"END FreeSpace;⓪ ⓪ PROCEDURE CreateDir ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L  -10(A3),A0⓪(MOVE.W  -06(A3),D0⓪(JSR     str0⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$39,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪%C: SUBQ.L  #6,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: MOVE    D0,(A1)⓪(BRA     C⓪$END⓪"END CreateDir;⓪ ⓪ PROCEDURE DeleteDir ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L  -10(A3),A0⓪(MOVE.W  -06(A3),D0⓪(JSR     str0⓪(MOVE.L  D0,-(A7)⓪(MOVE    #$3A,-(A7)⓪(TRAP    #1⓪(MOVE.L  -(A3),A1⓪(TST.L   D0⓪(BMI     E⓪(CLR.W   (A1)⓪%C: SUBQ.L  #6,A3⓪(; UNLK:⓪(UNLK    A5⓪(RTS⓪%E: MOVE    D0,(A1)⓪(BRA     C⓪$END⓪"END DeleteDir;⓪ ⓪ ⓪ PROCEDURE DrivesOnline (): DriveSet;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #10,-(A7)⓪(TRAP    #13⓪(ADDQ.L  #2,A7⓪(SWAP    D0⓪(CLR     D0⓪(SWAP    D0⓪(LSL.L   #1,D0⓪(MOVE.L  D0,(A3)+⓪$END⓪"END DrivesOnline;⓪ ⓪ ⓪ PROCEDURE GetDirEntry ( REF fileName: ARRAY OF CHAR;⓪8VAR entry: DirEntry; VAR res: INTEGER );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -14(A3),A0⓪(MOVE.W  -10(A3),D0⓪(JSR     str0⓪ ⓪(MOVE.W  #$0010,-(A7)    ; Attribut: alle Dateien/Ordner⓪(MOVE.L  D0,-(A7)        ; zuerst D0 (^name) sichern⓪(MOVE    #$4E,-(A7)⓪(TRAP    #1              ; FSFIRST⓪(ADDQ.L  #8,A7⓪ ⓪(MOVE.L  -8(A3),A1       ; ADR (entry)⓪ ⓪(; Name in Dir vorhanden ?⓪(TST.L   D0⓪(BMI     fals⓪ ⓪(; DirEntry kopieren⓪(MOVE.L  A1,-(A7)⓪(JSR     getDta⓪(MOVE.L  D0,A0⓪(MOVE.L  (A7)+,A1⓪(JSR     copyDirEntry⓪(MOVEQ   #0,D0⓪(BRA     ende⓪ ⓪&fals⓪(; entry löschen⓪(MOVEQ   #14,D1⓪$l1: CLR.W   (A1)+⓪(DBRA    D1,l1⓪ ⓪&ende⓪(MOVE.L  -(A3),A0        ; ok⓪(MOVE    D0,(A0)⓪ ⓪(SUBA.W  #10,A3          ; name + entry⓪(UNLK    A5⓪$END⓪"END GetDirEntry;⓪ ⓪ ⓪ PROCEDURE FileExists ( REF fileName: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -6(A3),A0⓪(MOVE.W  -2(A3),D0⓪(JSR     str0⓪(SUBQ.L  #6,A3⓪ ⓪(MOVE.L  D0,A0⓪(TST.B   (A0)⓪(BNE     ok⓪ ⓪(CLR     D0⓪(BRA     ende⓪ ⓪$ok: CLR     -(A7)           ; Attribut: nur Dateien⓪(MOVE.L  D0,-(A7)        ; zuerst D0 (^name) sichern⓪(MOVE    #$4E,-(A7)⓪(TRAP    #1              ; FSFIRST⓪(ADDQ.L  #8,A7⓪ ⓪(; Name in Dir vorhanden ?⓪(TST.L   D0⓪(SPL     D0⓪(ANDI    #1,D0⓪&ende:⓪(MOVE    D0,(A3)+⓪ ⓪(UNLK    A5⓪$END⓪"END FileExists;⓪ ⓪ ⓪ PROCEDURE PathExists ( REF path: ARRAY OF CHAR ): BOOLEAN;⓪!(*⓪"* Hier kann nicht mit Fsfirst gearbeitet werden, weil bestimmte Pfadnamen⓪"* nicht als Root-Dir erkennbar wären (z.B. "..\") und dort Fsfirst nicht⓪"* funktioniert.⓪"*)⓪"BEGIN⓪$ASSEMBLER⓪(LINK    A5,#0⓪(SUBA.W  #66,A7⓪(MOVE.L  A7,(A3)+⓪(MOVE    #65,(A3)+⓪(JSR     GetDefaultPath⓪(SUBA.W  #66,A7⓪(MOVE.L  A7,(A3)+⓪(MOVE    #65,(A3)+⓪(SUBA.W  #12,A7⓪(MOVE.L  A7,(A3)+⓪(MOVE    #11,(A3)+⓪(JSR     SplitPath⓪(ADDA.W  #12,A7⓪(MOVE.L  A7,(A3)+⓪(MOVE    #65,(A3)+⓪(SUBQ.L  #2,A7⓪(MOVE.L  A7,(A3)+⓪(JSR     SetDefaultPath⓪(TST     (A7)+⓪(SPL     D0⓪(ANDI    #1,D0⓪(MOVE    D0,(A3)+⓪(ADDA.W  #66,A7⓪(MOVE.L  A7,(A3)+⓪(MOVE    #65,(A3)+⓪(SUBQ.L  #2,A7⓪(MOVE.L  A7,(A3)+⓪(JSR     SetDefaultPath⓪(UNLK    A5⓪$END⓪"END PathExists;⓪ ⓪ ⓪ PROCEDURE SetDefaultPath ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪"(*$L+*)⓪"BEGIN⓪$SetDefaultDrive ( StrToDrive (path) );⓪$SetCurrentDir ( StrToDrive (path), path, result )⓪"END SetDefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE DefaultPath (): PathStr;⓪"(*$L+*)⓪"VAR path: PathStr;⓪"BEGIN⓪$GetDefaultPath (path);⓪$RETURN path⓪"END DefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetDefaultPath ( VAR path: ARRAY OF CHAR );⓪"(*$L+*)⓪"BEGIN⓪$GetCurrentDir (defaultDrv, path);⓪$Strings.Insert (DriveToStr (DefaultDrive ()), 0, path, strok);⓪"END GetDefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetDTA ( VAR dta: DTA );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #$2F,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #2,A7⓪(MOVE.L  -(A3),A0⓪(MOVE.L  D0,(A0)⓪$END⓪"END GetDTA;⓪ ⓪ PROCEDURE SetDTA ( dta: DTA );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),-(A7)⓪(MOVE    #$1A,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪$END⓪"END SetDTA;⓪ ⓪ ⓪ PROCEDURE SearchFirst (     REF wildcard: ARRAY OF CHAR;⓪<select  : FileAttrSet;⓪8VAR result  : INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -12(A3),A0⓪(MOVE.W  -08(A3),D0⓪(JSR     str0⓪ ⓪(MOVEQ   #0,D1⓪(MOVE.B  -06(A3),D1⓪(MOVE.W  D1,-(A7)⓪(MOVE.L  D0,-(A7)        ; zuerst D0 (^name) sichern⓪(MOVE    #$4E,-(A7)⓪(TRAP    #1              ; FSFIRST⓪(ADDQ.L  #8,A7⓪ ⓪(; wenn leeres Dir, dann 'fNoMoreFiles' liefern.⓪(CMPI    #-33,D0         ; file not found ?⓪(BNE     ok3⓪(MOVEQ   #fNoMoreFiles,D0⓪&ok3⓪ ⓪(MOVE.L  -(A3),A0        ; ok⓪(MOVE    D0,(A0)⓪ ⓪(SUBA.W  #6,A3          ; name + attrib⓪(UNLK    A5⓪$END⓪"END SearchFirst;⓪ ⓪ PROCEDURE SearchNext  ( VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(LINK    A5,#0⓪ ⓪(MOVE    #$4F,-(A7)⓪(TRAP    #1              ; FSFIRST⓪(ADDQ.L  #2,A7⓪ ⓪(MOVE.L  -(A3),A0        ; ok⓪(MOVE    D0,(A0)⓪ ⓪(UNLK    A5⓪$END⓪"END SearchNext;⓪ ⓪ ⓪ PROCEDURE getSt2 (ad:ADDRESS; n:INTEGER; VAR msg:ARRAY OF CHAR): BOOLEAN;⓪"VAR s: POINTER TO ARRAY [0..31] OF CHAR;⓪"(*$L+*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  ad(A6),A0⓪(MOVE.W  n(A6),D0⓪(⓪%l: CMP.W   (A0)+,D0⓪(BNE     c⓪(⓪(; gefunden⓪(MOVE.L  A0,s(A6)⓪(BRA     e⓪(⓪%c: TST.B   (A0)    ; Listenende ?⓪(BEQ     f       ; Ja, -> nicht gefunden⓪(⓪%m: ADDA.W  #32,A0⓪(BRA     l⓪(⓪%f: CLR.L   s(A6)⓪%e:⓪$END;⓪$IF s#NIL THEN⓪&Strings.Assign (s^,msg, strok);⓪&RETURN TRUE⓪$ELSE⓪&RETURN FALSE⓪$END⓪"END getSt2;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetErrMsg ( n: INTEGER; VAR msg: ARRAY OF CHAR );⓪"VAR p:INTEGER;⓪"(*$L+*)⓪"BEGIN⓪$msg[0]:=0C;⓪$IF FileErrMsg=NIL THEN⓪&Strings.Assign ('Unknown error #@',msg,strok)⓪$ELSE⓪&IF ~getSt2 (FileErrMsg,n,msg) THEN⓪(IF n<0 THEN⓪*IF getSt2 (FileErrMsg,-32768,msg) THEN END⓪(ELSE⓪*IF getSt2 (FileErrMsg,32767,msg) THEN END⓪(END⓪&END;⓪$END;⓪$p:=Strings.Pos ('@',msg,0);⓪$IF p>=0 THEN⓪&Strings.Delete (msg,p,1,strok);⓪&Strings.Insert (StrConv.IntToStr(n,0),p,msg,strok)⓪$END⓪"END GetErrMsg;⓪"(*$L=*)⓪ ⓪ BEGIN⓪"null:= 0;⓪"(*$C-*) fspec:= ' :\\X'; (*$C+*)⓪ END Directory.⓪ ə
  2. (* $000030D0$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$00005120$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFF21D8C$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFED45E4$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACFÇ$00001639T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000016FD$00002074$00004C41$000038DB$0000201C$FFEE7904$00000568$0000054D$FFEE4CC0$FFEE4CC0$00001709$00001655$FFF13E0C$0000165F$0000164C$00001639ÉÇâ*)
  3.